<?php
namespace app\common\logic;
define('APPID', config('mini_appid'));
define('APPSECRET', config('mini_appSecret'));
class WxMini
{
    //获取open_id
    public function getOpenId(){
        $js_code = input('js_code');
        //通过code换取网页授权access_token和openid
        $curl = 'https://api.weixin.qq.com/sns/jscode2session?appid='.APPID.'&secret='.APPSECRET."&js_code=$js_code&grant_type=authorization_code";
        $content = $this->_request($curl);
        return $content;
    }

    /**发送模板消息
     * @param $touser string 目标用户的open_id
     * @param $template string 模板ID
     * @param $page string 跳转页
     * @param $data array 发送信息
     * @return array 发送回执
     */
    public function sendNotify($touser,$template,$page,$data){
        $ACCESS_TOKEN = $this -> getAccessToken();
        $curl = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=$ACCESS_TOKEN";
        switch ($template){
            //新增客户提醒（转介/轮牌）
            case '1':
                $template_id = 'OpsdGCIL1ph2uNFbkHof5jY6Ny0KYIlTiqh32hdXSHU';
                break;
            //转介被接收提醒
            case '2':
                $template_id = '16_698Rjfm-5QSsD-ZBW53-lktk3KtkzNQRtB8_ww_s';
                break;
            //成交提醒
            case '3':
                $template_id = 'XHxObx7MEeqGHdnEcd-LHDVTUCvrOxXUDCl3nwPfTzY';
                break;
            //用户报备提醒
            case '4':
                $template_id = 'DjHM72oe0zGV79c9uQ_H0GX3q4T0Dk_aXtORIwZ9qyg';
                break;
            //结佣金提醒
            case '5':
                $template_id = 'jplfHi1D5NCGzvQhJ4Aihvpw9DIw-W-JHllRLtMRyRs';
                break;
        }


        $allFormID = $this -> allFormID($touser);
        $form_id = end(array_column($allFormID,'form_id'));
        $sendData['touser'] = $touser;
        $sendData['template_id'] = $template_id;
        $sendData['page'] = $page;
        $sendData['form_id'] = $form_id;
        $sendData['data'] = $data;
        $sendData = json_encode($sendData,true);

        //删除form_id
        foreach ($allFormID as $k => $value){
            if ($value['form_id'] ==$form_id){
                unset($allFormID[$k]);
                break;
            }
        }
        $allFormID = array_merge($allFormID);
        cache('form_id'.$touser,$allFormID,3600*24*365);
        return  $this->_request($curl,$https=true,$method='POST',$sendData);
    }

    //获取AccessToken
    public function getAccessToken(){
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . APPID . "&secret=" . APPSECRET ."";
        $str = $this->_request($url);
        $str = json_decode($str,true);
        return  $str['access_token'];

        //判断是否存在该文件，如果存在，就读取并取出（时间）若没有，则调用getNewAccess_token函数
//        $str = cache('access_token');
//        if (!$str || time()-$str['create_time'] > 3600){
//            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . APPID . "&secret=" . APPSECRET ."";
//            $str = $this->_request($url);
//            $str = json_decode($str,true);
//            //将时间写入数组
//            if ($str['access_token'])
//                $str['create_time'] = time();
//            //写入文件
//            cache('access_token',$str,365*24*365);
//        }
//        return  $str['access_token'];
    }

    //设置网络请求配置
    public function _request($curl,$https=true,$method='GET',$data=null){
        // 创建一个新cURL资源
        $ch = curl_init();

        // 设置URL和相应的选项
        curl_setopt($ch, CURLOPT_URL, $curl);    //要访问的网站
        curl_setopt($ch, CURLOPT_HEADER, false);    //启用时会将头文件的信息作为数据流输出。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  //将curl_exec()获取的信息以字符串返回，而不是直接输出。

        if($https){
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  //FALSE 禁止 cURL 验证对等证书（peer's certificate）。
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);  //验证主机
        }
        if($method == 'POST'){
            curl_setopt($ch, CURLOPT_POST, true);  //发送 POST 请求
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //全部数据使用HTTP协议中的 "POST" 操作来发送。
        }


        // 抓取URL并把它传递给浏览器
        $content = curl_exec($ch);
        if ($content  === false) {
            return "网络请求出错: " . curl_error($ch);
        }
        //关闭cURL资源，并且释放系统资源
        curl_close($ch);

        return $content;
    }


    //获取目前所有合法form_id
    public  function allFormID($open_id){
        $allFormID = cache('form_id'.$open_id);
        //删除过期formID,存储顺序按新到旧
        foreach ($allFormID as $k=> $value){
            if (time() - $value['create_time']>3600*24*7-200){
                array_splice($allFormID,$k,count($allFormID));
                break;
            }
        }

        return $allFormID;
    }

    //追加form_id
    public function addFromID($open_id,$form_id){
        $allFormID = $this -> allFormID($open_id);
        //追加新的form_id
        if (!in_array($form_id,array_column($allFormID,'form_id'))){
            if (!$allFormID)
                $allFormID = [];
            //最大存储100条
            if (count($allFormID)<100)
                array_unshift($allFormID,[
                    'form_id' => $form_id,
                    'create_time' => time()
                ]);
        }

        cache('form_id'.$open_id,$allFormID,3600*24*365);
        return true;

    }

    //删除form_id
//    public function delFormID($open_id,$form_id){
//        $allFormID = $this -> allFormID($open_id);
//        foreach ($allFormID as $k => $value){
//            if ($value['form_id'] ==$form_id){
//                unset($allFormID[$k]);
//                break;
//            }
//        }
//        $allFormID = array_merge($allFormID);
//        cache('form_id'.$open_id,$allFormID,3600*24*365);
//        return $allFormID;
//
//    }

}